"""
拉格朗日插值代码
"""

import pandas as pd
# 导入拉格朗日插值函数
from scipy.interpolate import lagrange

# 输入数据路径,需要使用Excel格式；
inputfile = '../Data/missing_data.xls'
# 输出数据路径,需要使用Excel格式
outputfile = '../Data/Temp/missing_data_processed.xls'

# 读入数据
data = pd.read_excel(inputfile, header=None)


# 自定义列向量插值函数
# s为列向量，n为被插值的位置，k为取前后的数据个数，默认为5
def ployinterp_column(s, n, k=5):
    # 取数
    """
    取数报错代码
    y = s[list(range(n - k, n)) + list(range(n + 1, n + 1 + k))]
    原因：
        Series不支持反向索引，即从结束处反向计数（类似于p.Series[-1]、p.Series[:3]）
        在第n位之前出现了缺失值，导致n-k出现了负值
    """
    # y = s[list(range(n - k, n)) + list(range(n + 1, n + 1 + k))]
    y = s.reindex(list(range(n - k, n)) + list(range(n + 1, n + 1 + k)))

    # 剔除空值
    y = y[y.notnull()]
    # 插值并返回插值结果
    return lagrange(y.index, list(y))(n)


# 逐个元素判断是否需要插值
for i in data.columns:
    for j in range(len(data)):
        # 如果为空即插值
        if (data[i].isnull())[j]:
            data[i][j] = ployinterp_column(data[i], j)

# 输出结果
data.to_excel(outputfile, header=None, index=False)
